﻿#include"源.h"

//根据国际标准IEEE（电⽓和电⼦⼯程协会） 754，任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式：
//V = (−1)∗ S M ∗ 2E
//•(−1)S 表⽰符号位，当S = 0，V为正数；当S = 1，V为负数
//• M 表⽰有效数字，M是⼤于等于1，⼩于2的
//• 2
//E 表⽰指数位
//浮点数的存储其实存储的是S、M、E相关的值
//对于32位的浮点数，最⾼的1位存储符号位S，接着的8位存储指数E，剩下的23位存储有效数字M
//对于64位的浮点数，最⾼的1位存储符号位S，接着的11位存储指数E，剩下的52位存储有效数字M
//IEEE 754 规定，在计算机内部保存M时，默认这个数的第⼀位总是1，因此可以被舍去，只保存后⾯的
//xxxxxx部分。⽐如保存1.01的时候，只保存01，等到读取的时候，再把第⼀位的1加上去。这样做的⽬
//的，是节省1位有效数字。以32位浮点数为例，留给M只有23位，将第⼀位的1舍去以后，等于可以保
//存24位有效数字。
// 存⼊内存时E的真实值必须再加上⼀个中间数，对于8位的E，这个中间数是127；对于11位的E，这个中间数是1023
//例：5.5 - 十进制的浮点数表示形式 - 101.1 - 1.011*2² - (-1)^0*1.011*2² - S=0 - M=1.011 - E=2


//int main()
//{
//	float f = 5.5f;
//	//5.5
//	//101.1
//	//1.011*2
//	//(-1)^0*1.011*2²
//	//S=0 - M=1.011 - E=2
//	//0100 0000 1011 0000 0000 0000 0000 - 二进制
//	//40 B0 00 00 - 十六进制
//	return 0;
//}


//整型和浮点型在内存中的存储方式是不一样的
//int main()
//{
//	int n = 9;
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);
//	printf("pFloat值为：%f\n", *pFloat);
//	*pFloat = 9.0;
//	printf("n的值为：%d\n", n);
//	printf("*pFloat值为：%f\n", *pFloat);
//	return 0;
//}


//x86环境 小端字节序
//int main()
//{
//	int a[4] = { 1,2,3,4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);//%x - 打印十六进制整数
//	return 0;
//}


//int main()
//{
//	unsigned int i;//>=0
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//		Sleep(1000);
//	}
//	return 0;
//}


//unsigned char i = 0;//unsigned char的存储范围0~255
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("Hello world\n");
//	}
//	return 0;
//}


//int main()
//{
//	char a[1000];//0~999
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	//-1 -2 -3 -4 …… -127 -128 127 126 …… 0 -1 -2
//	printf("%d", strlen(a));
//	return 0;
//}


//int main()
//{
//	char a = 128;
//	//00000000000000000000000010000000
//	//10000000 - a
//	printf("%u\n", a);
//	//整型提升 - 11111111111111111111111110000000
//	return 0;
//}


//int main()
//{
//	char a = -128;
// //10000000000000000000000010000000
// //10000000 - a
//	printf("%u\n", a);//%u - unsigned int - 认为a中存放的是无符号数
//	//a是char类型，首先整型提升，补符号位 - 11111111111111111111111110000000
//	return 0;
//}


//int main()
//{
//	char a = -1;//char到底是有符号还是无符号取决于编译器 - VS上char==signed char
//	//11111111 - a
//	//整型提升 - 11111111111111111111111111111111
//	signed char b = -1;//内存中的最高位被当作符号位
//	//11111111 - b
//	//整型提升 - 11111111111111111111111111111111
//	unsigned char c = -1;
//	//11111111 - c
//	//整型提升 - 00000000000000000000000011111111
//	printf("a=%d,b=%d,c=%d\n", a, b, c);
//	return 0;
//}


//1.整数在内存中存储的是二进制的补码；2.在调试窗口中观察内存的时候，为了方便展示，显示的是十六进制的值；3.存储的顺序是倒置的
//大端字节序存储：把低位字节的内容存储到高地址处，把高位字节的内容存储到低地址处
//小端字节序存储：把低位字节的内容存储到低地址处，把高位字节的内容存储到高地址处
//存储模式由硬件决定

//int check_sys()
//{
//	int n = 1;
//	return *(char*)&n;
//}
//
//int main()
//{
//	int ret = check_sys();
//	if (ret == 1)
//	{
//		printf("小端\n");
//	}	
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}


//int main()
//{
//	int n = 1;
//	if (*(char*)&n == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}


//int main()
//{
//	int n = 0x11223344;
//	return 0;
//}
 

//整数在内存中的存储 - 存储的是二进制 - 二进制表示：原码、反码、补码 - 内存中存储的是补码
